package net.interneteidee.entity;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.validator.constraints.NotEmpty;

@XmlRootElement
@Entity
public class Famiglia implements Serializable {

	@Id
	@GeneratedValue
	private long idFamiglia;

	@NotEmpty(message="Nome famiglia obbligatorio ")
	private String nome;

	@NotEmpty(message="Descrizione Famiglia obbligatorio")
	private String descrizione;

	
	private boolean abilitata;

	@OneToMany(mappedBy = "famiglia")
	private List<Categoria> categorie;

	public Famiglia() {
		// TODO Auto-generated constructor stub
	}

	public Famiglia(String nome, String descrizione,
			boolean abilitata) {
		super();
		this.nome = nome;
		this.descrizione = descrizione;
		this.abilitata = abilitata;
	}

	public long getIdFamiglia() {
		return idFamiglia;
	}

	public void setIdFamiglia(long idFamiglia) {
		this.idFamiglia = idFamiglia;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDescrizione() {
		return descrizione;
	}

	public void setDescrizione(String descrizione) {
		this.descrizione = descrizione;
	}

	public boolean isAbilitata() {
		return abilitata;
	}

	public void setAbilitata(boolean abilitata) {
		this.abilitata = abilitata;
	}

	@XmlTransient
	public List<Categoria> getCategorie() {
		return categorie;
	}

	public void setCategorie(List<Categoria> categorie) {
		this.categorie = categorie;
	}

	/**
	 * Aggiunge una categoria alla famiglia corrente
	 * 
	 * @param categoria
	 */
	public void addCategoria(Categoria categoria) {
		categorie.add(categoria);
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return nome;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (abilitata ? 1231 : 1237);
		result = prime * result
				+ ((descrizione == null) ? 0 : descrizione.hashCode());
		result = prime * result + (int) (idFamiglia ^ (idFamiglia >>> 32));
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Famiglia other = (Famiglia) obj;
		if (abilitata != other.abilitata)
			return false;
		if (descrizione == null) {
			if (other.descrizione != null)
				return false;
		} else if (!descrizione.equals(other.descrizione))
			return false;
		if (idFamiglia != other.idFamiglia)
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}
	

	
}
